package com.example.reflect;

import java.lang.reflect.Field;

class FieldTest {
    private String name;

    public FieldTest(String name) {
        this.name = name;
    }

    public String getNameByReflection() throws NoSuchFieldException,IllegalAccessException{
        Field nameField = this.getClass().getDeclaredField("name");
        Field nameField2 = this.getClass().getDeclaredField("name");

        // 注意，nameField和nameField2是两个不同的对象
        boolean isTheSameObj = (nameField == nameField2); // false

        // 将此反射对象的accessible标志设置为true，表示反射对象在使用时应抑制对 Java 语言访问控制的检查。
        // 这会破坏封装，使得可以通过nameField.get读取这个nameField代表的私有字段的值
        nameField.setAccessible(true);
        return  (String) nameField.get(this);
    }
}

public class FieldTests {
    public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
        String nameByReflection = new FieldTest("张三").getNameByReflection();
        System.out.println(nameByReflection);
    }
}
